package com.example.chamberlainserver.mapper;

import com.example.chamberlainserver.Entry.StorageLocation;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 存放位置数据访问接口
 */
@Mapper
public interface StorageLocationMapper {
    
    /**
     * 添加存放位置
     * @param location 存放位置信息
     * @return 影响行数
     */
    int insertLocation(StorageLocation location);
    
    /**
     * 根据ID更新存放位置
     * @param location 存放位置信息
     * @return 影响行数
     */
    int updateLocation(StorageLocation location);
    
    /**
     * 根据ID删除存放位置
     * @param id 存放位置ID
     * @return 影响行数
     */
    int deleteLocation(@Param("id") Integer id);
    
    /**
     * 根据ID查询存放位置
     * @param id 存放位置ID
     * @return 存放位置信息
     */
    StorageLocation getLocationById(@Param("id") Integer id);
    
    /**
     * 根据位置名称查询存放位置
     * @param locationName 位置名称
     * @return 存放位置信息
     */
    StorageLocation getLocationByName(@Param("locationName") String locationName);
    
    /**
     * 获取所有存放位置
     * @return 存放位置列表
     */
    List<StorageLocation> getAllLocations();
    
    /**
     * 根据父ID获取子存放位置
     * @param parentId 父存放位置ID
     * @return 子存放位置列表
     */
    List<StorageLocation> getSubLocations(@Param("parentId") Integer parentId);
    
    /**
     * 获取顶级存放位置（parentId为null或0的位置）
     * @return 顶级存放位置列表
     */
    List<StorageLocation> getTopLocations();
    
    /**
     * 根据位置名称搜索存放位置
     * @param name 位置名称关键字
     * @return 存放位置列表
     */
    List<StorageLocation> searchLocationsByName(@Param("name") String name);
    
    /**
     * 根据管理员搜索存放位置
     * @param manager 管理员名称
     * @return 存放位置列表
     */
    List<StorageLocation> getLocationsByManager(@Param("manager") String manager);
    
    /**
     * 更新存放位置路径
     * @param id 存放位置ID
     * @param locationPath 新的位置路径
     * @return 影响行数
     */
    int updateLocationPath(
            @Param("id") Integer id, 
            @Param("locationPath") String locationPath,
                @Param("update_time") String update_time);
    
    /**
     * 根据父ID统计子位置数量
     * @param parentId 父存放位置ID
     * @return 子位置数量
     */
    int countSubLocations(@Param("parentId") Integer parentId);
    
    /**
     * 检查位置路径是否存在
     * @param locationPath 位置路径
     * @return 存在的位置数量
     */
    int checkLocationPathExists(@Param("locationPath") String locationPath);
}